package com.kaigejava.linkedlist.josephu;

import lombok.Data;

/**
 * @author kaigejava
 * josephu问题
 */
public class JosePhu {
}


/**
 * 创建一个环形单向链表
 * 环形链表，先创建一个无序号的头结点
 * 1：添加
 * 2：显示
 * 3：根据指定位置开始，查询到指定数量后重新开始
 *【重点】：
 * 为什么链表中头结点一般都不能动呢？
 * 因为java中没有指针的概念。所以，这个头结点可以模拟指针使用
 */
class CircleSingleLinkedList{
    //声明一个没有序号的节点，表示开始
    Boy frist = null;

    /**
     * 根据指定的数量创建环形链表
     * 思路：
     * 如果只有一个的话，next执行自己;
     * 如果大于1个的话：
     * 新节点的下一个节点指向第一个节点。为了形成环形
     * 临时变量curr这个也是重点
     * @param nums
     */
    public void addBoy(int nums){
        if(nums<1){
            System.out.println("创建数量不能小于1");
            return;
        }

        //临时变量。辅助指针，用来帮助构建环形链表的
        Boy curr = null;
        for (int i = 1; i < nums; i++) {
            Boy boy = new Boy(i);
            if(i == 1){
                frist = boy;
                //如果只有一个，那么，next就指向自己。这样也就形成了环形 【这里是重点】
                frist.setNextBoy(frist);
                //将当前指向第一个
                curr = frist;
            }else{
                //当前的下一个指向新创建的boy.如果nums=2的话，当运行这里 curr就是frist.所以frist的next就是2
                curr.setNextBoy(boy);
                //新的节点的下一个节点指向开始位置。是为了形成环【这里是重点】
                boy.setNextBoy(frist);
                //将当前辅助指针，指向新创建的节点。为后面使用
                curr = boy;
            }

        }

    }

    /**
     * 显示环形链表.
     * while(true)循环。结束的标识就是：当前节点的next
     */
    public void showBoy(){
        if(null == frist){
            System.out.println("没有数据，不展示");
            return;
        }
        //因为Java中没有指针。所以，这里就借用头节点作为辅助指针
        Boy curr = frist;
        while(true){
            System.out.printf("编号为 %d ",curr.getNo());
            if(curr.nextBoy == frist){
                //说明循环完了。跳出循环
                break;
            }
            curr = curr.nextBoy;
        }

    }

}

/**
 * node节点
 * 小孩子
 */
@Data
class Boy{
    public  int no;
    public  Boy nextBoy;
    public Boy(int no){
        this.no = no;
    }
}
